#include <bits/stdc++.h>

using namespace std;
using P = pair<int, int>;
using ll = long long;

int main() {
  int n;
  cin >> n; // 输入工作数量

  vector<P> jobs(n);
  for (int i = 0; i < n; i++)
    cin >> jobs[i].first >> jobs[i].second; // 输入每个工作的截止时间和收益

  sort(jobs.begin(), jobs.end()); // 按照截止时间排序
  // pair 默认对first升序，当first相同时对second升序；

  ll total = 0;                                     // 初始化总收益
  priority_queue<int, vector<int>, greater<int>> Q; // 小根堆，用于存储收益

  // d是截止时间，v是收益
  for (const auto &[deadline, profit] : jobs) { // 遍历每个工作
    if (deadline <= Q.size()) { // 如果当前工作截止时间小于等于已处理工作的数量
      int minProfit = Q.top(); // 获取当前最小收益
      Q.pop();                 // 移除最小收益
      if (profit > minProfit)  // 如果当前工作的收益大于最小收益
        total += profit - minProfit; // 更新总收益
    } else {
      total += profit; // 否则直接加上当前工作的收益
    }
    Q.push(profit); // 将当前工作的收益加入小根堆
  }

  cout << total << '\n'; // 输出总收益

  return 0; // 程序结束
}